Примеры программ

Первый уровень сложности

1. Обмен значениями переменных с помощью буфера обмена, рекуррентных формул и кортежей.
(Лекция 1)

# Вариант 1: Буфер обмена
x, y = 3, 5
buf = x
x = y
y = buf

# Вариант 2: Рекуррентные формулы
x, y = 3, 5
x = x + y  # x=8
y = x - y  # y=3
x = x - y  # x=5

# Вариант 3: Кортежи (Pythonic way)
x, y = 3, 5
x, y = y, x

2. Задача про треугольник (составные условия vs списки/множества vs itertools/кванторы).
Заданы три отрезка a, b, c. Существует ли треугольник? Какой тип (равносторонний, равнобедренный, разносторонний)?
(Лекция 1)

# Вариант 1: Составные условия (if/and/or)
if a + b > c and a + c > b and b + c > a:
    print("Существует")
    if a == b == c:
        print("Равносторонний")
    elif a == b or a == c or b == c:
        print("Равнобедренный")
    else:
        print("Разносторонний")
else:
    print("Не существует")

# Вариант 2: Списки и множества (убираем дубликаты)
a, b, c = sorted([a, b, c]) # Сортировка упрощает проверку существования
if a + b > c:
    unique_sides = len({a, b, c})
    if unique_sides == 1: print("Равносторонний")
    elif unique_sides == 2: print("Равнобедренный")
    else: print("Разносторонний")
else:
    print("Не существует")

# Вариант 3: Itertools и кванторы
from itertools import permutations
# Проверяем неравенство треугольника для всех перестановок
if all(x + y > z for x, y, z in permutations([a, b, c], 3)):
    # Считаем количество пар равных сторон
    equal_pairs = sum(1 for x, y in permutations([a, b, c], 2) if x == y)
    if equal_pairs == 6: print("Равносторонний") # Все равны
    elif equal_pairs > 0: print("Равнобедренный")
    else: print("Разносторонний")

3. Эпидемия на корабле (флаги vs кванторы).
Есть список температур. Определить статус: "Все здоровы", "Все больны", "Есть и те, и те".
(Лекция 1)

T = [36.6, 37.5, 36.6] # Пример данных

# Вариант 1: Флаги
has_sick = False
has_healthy = False
for t in T:
    if t > 37: has_sick = True
    else: has_healthy = True

if has_sick and has_healthy: print("И больные, и здоровые")
elif has_sick: print("Все больны")
else: print("Все здоровы")

# Вариант 2: Кванторы
is_sick_list = [t > 37 for t in T] # Список булевых значений
if all(is_sick_list): print("Все больны")
elif any(is_sick_list): print("И больные, и здоровые") # Если не все (проверено выше), но кто-то есть
else: print("Все здоровы")

4. Палиндром (перебор vs подсчет букв).
Можно ли из букв строки составить палиндром?
(Лекция 2)

s = "aabbc"

# Вариант 1: Перебор (медленно, itertools) - только проверка факта
from itertools import permutations
found = False
for p in permutations(s):
    word = "".join(p)
    if word == word[::-1]:
        found = True
        break
print("Можно" if found else "Нельзя")

# Вариант 2: Подсчет (эффективно)
# Палиндром можно составить, если букв с нечетным количеством <= 1
odd_counts = sum(1 for char in set(s) if s.count(char) % 2 == 1)
print("Можно" if odd_counts <= 1 else "Нельзя")

5. Магический квадрат (рекуррентные формулы vs множества/кванторы).
Равна ли сумма чисел по строкам, столбцам и диагоналям?
(Лекция 2)

M = [[2, 7, 6], [9, 5, 1], [4, 3, 8]]
n = len(M)

# Вариант 1: Рекуррентные формулы (циклы и флаг)
is_magic = True
target_sum = sum(M[0]) # Сумма первой строки как эталон
# Проверка строк
for i in range(n):
    if sum(M[i]) != target_sum: is_magic = False
# ... (аналогичные циклы для столбцов и диагоналей с флагом is_magic)

# Вариант 2: Множества и кванторы (однострочник)
# Собираем все суммы в множество. Если длина множества == 1, то все суммы равны.
sums = {
    sum(M[i][i] for i in range(n)),        # Главная диагональ
    sum(M[i][n-1-i] for i in range(n))     # Побочная диагональ
}
sums |= {sum(row) for row in M}            # Строки (объединение множеств)
sums |= {sum(M[r][c] for r in range(n)) for c in range(n)} # Столбцы

print("Магический" if len(sums) == 1 else "Обычный")

6. Решето Эратосфена.
Поиск простых чисел до N.
(Лекция 3)

n = 30
# Создаем "табличку" (список), изначально заполненную числами
L = list(range(n + 1))
L[1] = 0 # 1 не простое

for i in range(2, n + 1):
    if L[i] != 0: # Если число не вычеркнуто
        # Вычеркиваем (зануляем) все кратные начиная с i*i
        for j in range(i * i, n + 1, i):
            L[j] = 0

# Собираем оставшиеся ненулевые числа
primes = [x for x in L if x != 0]
print(primes)

7. Рекурсивные функции (Факториал, Фибоначчи).
(Лекция 4)

def fact(n):
    if n == 1: return 1
    return n * fact(n - 1)

def fib(n):
    if n <= 2: return 1
    return fib(n - 1) + fib(n - 2)

8. Числа Фибоначчи через список и скользящее окно.
(Лекция 4)

# Через список (память O(N))
def fib_list(n):
    L = [0, 1, 1]
    for i in range(3, n + 1):
        L.append(L[-1] + L[-2])
    return L[n]

# Скользящее окно (память O(1))
def fib_window(n):
    a, b = 1, 1
    for _ in range(3, n + 1):
        a, b = b, a + b # Обмен и сложение
    return b

9. Быстрое возведение в степень.
Рекурсивный алгоритм $O(\log N)$.
(Лекция 4)

def power(a, n):
    if n == 0: return 1
    if n % 2 == 0:
        # Если степень четная: a^n = (a^2)^(n/2)
        return power(a * a, n // 2)
    else:
        # Если нечетная: a^n = a * a^(n-1)
        return a * power(a, n - 1)

10. Классы (Точка, Отрезок, Человек).
(Лекции 7, 8)

class Point:
    def __init__(self, x=0, y=0):
        self.x, self.y = x, y

class Segment:
    def __init__(self, p1, p2):
        self.p1, self.p2 = p1, p2

    def length(self):
        return ((self.p1.x - self.p2.x)**2 + (self.p1.y - self.p2.y)**2)**0.5

class Person:
    def __init__(self, name, year):
        self.name = name
        self.year = year

    @property
    def age(self): # Вычисляемое свойство
        return 2025 - self.year
← Меню